/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package formularze;

import bazy.HibernateUtil;
import bazy.Oferty;
import bazy.SpecyfikacjaZamowienia;
import bazy.Statusy;
import bazy.Uzytkownicy;
import bazy.Zalaczniki;
import bazy.Zamowienia;
import bazy.Zapotrzebowanie;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import org.hibernate.Session;

/**
 * Klasa do obsługi zamówień wewnetrznych.
 * @author Grzesiek
 */
public class Zam_wew extends Formularz {

    /**
     * usunięcie formularza z bazy.
     * @param id
     */
    @Override
    public void usun(int id) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Zamowienia zam = (Zamowienia) session.load(Zamowienia.class, id);
        org.hibernate.Transaction tx = session.beginTransaction();

        Iterator<Zalaczniki> zalacz_iter = zam.getZalacznikis().iterator();
        while (zalacz_iter.hasNext()) {
            session.delete(zalacz_iter.next());

        }
        Iterator<SpecyfikacjaZamowienia> spec_iter = zam.getZapotrzebowanies().iterator().next().getSpecyfikacjaZamowienias().iterator();
        while (spec_iter.hasNext()) {
            session.delete(spec_iter.next());

        }

        Iterator<Oferty> of_iter = zam.getOferties().iterator();
        while (of_iter.hasNext()) {
            session.delete(of_iter.next());

        }
        session.delete(zam.getZapotrzebowanies().iterator().next());
        session.delete(zam);
        tx.commit();
        session.close();
    }

    /**
     * usunięcie specyfikacji (co jest zamawiane)
     * @param sz nazwa specyfikacji do usunięcia
     */
    public void usun_spec(SpecyfikacjaZamowienia sz) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        org.hibernate.Transaction tx = session.beginTransaction();
        SpecyfikacjaZamowienia pom_sz = (SpecyfikacjaZamowienia) session.load(SpecyfikacjaZamowienia.class, sz.getIdspecyfikacjaZamowienia());
        session.delete(pom_sz);
        tx.commit();
        session.close();
    }

 /**
  * usunięcie oferty z zamówienia
  * @param of oferta, którą chcemy usunąć
  */
    public void usun_oferte(Oferty of) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        org.hibernate.Transaction tx = session.beginTransaction();
        Oferty pom_of = (Oferty) session.load(Oferty.class, of.getIdoferty());
        session.delete(pom_of);
        tx.commit();
        session.close();
    }

    /**
     * Dodanie nowego zamówienia do bazy, bądz edycja już istniejącego,
     *  W przypadku, gdy dodajemy nowe zamówienie, jako parametr id_zam podajemy 0.
     * @param id_zam
     * @param id_user
     * @param komentarz
     * @param zrodlo
     * @param uwagi
     * @param suma
     * @param kwal_zakup
     * @param Dostawca
     * @param specList
     * @param zalacznikiList
     * @param oferyList
     */
    public void dodaj(int id_zam, int id_user, String komentarz, String zrodlo, String uwagi, float suma, int kwal_zakup, String Dostawca, ArrayList<SpecyfikacjaZamowienia> specList, ArrayList<Zalaczniki> zalacznikiList, ArrayList<Oferty> oferyList) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        org.hibernate.Transaction tx = session.beginTransaction();
        Statusy pom_stat = (Statusy) session.load(Statusy.class, 1);
        Uzytkownicy pom_uz = (Uzytkownicy) session.load(Uzytkownicy.class, id_user);
        Zamowienia pom_zam = null;
        Zapotrzebowanie pom_zapo = null;
        if (id_zam == 0) {
            pom_zam = new Zamowienia(pom_stat, pom_uz, "Zamowienie wewnetrzne", new Date(), komentarz, zrodlo, uwagi, null, null, null, null, null, null);
            session.save(pom_zam);
            pom_zapo = new Zapotrzebowanie(pom_zam, kwal_zakup, suma, Dostawca, null);
            session.save(pom_zapo);
        } else {
            pom_zam = (Zamowienia) session.load(Zamowienia.class, id_zam);
            pom_zam.setKomentarz(komentarz);
            pom_zam.setZrodlofinansowania(zrodlo);
            pom_zam.setUwagidorealizacji(uwagi);
            session.update(pom_zam);
            pom_zapo = pom_zam.getZapotrzebowanies().iterator().next();
            pom_zapo.setKwalifikacjaZakupu(kwal_zakup);
            pom_zapo.setDostawca(Dostawca);
            pom_zapo.setKosztBrutto(suma);
            session.update(pom_zapo);

        }
        for (int i = 0; i < specList.size(); i++) {
            specList.get(i).setZapotrzebowanie(pom_zapo);
            if (specList.get(i).getIdspecyfikacjaZamowienia() == null) {
                if (specList.get(i).getNazwa().equals("")) {
                    continue;
                }
                session.save(specList.get(i));

            } else {
                session.update(specList.get(i));

            }
        }

        for (int i = 0; i < zalacznikiList.size(); i++) {
            zalacznikiList.get(i).setZamowienia(pom_zam);
            if (zalacznikiList.get(i).getIdzalaczniki() == null) {
                if (zalacznikiList.get(i).getNazwa().equals("")) {
                    continue;
                }
                session.save(zalacznikiList.get(i));

            } else {
                session.update(zalacznikiList.get(i));

            }
        }

        for (int i = 0; i < oferyList.size(); i++) {
            oferyList.get(i).setZamowienia(pom_zam);
            if (oferyList.get(i).getIdoferty() == null) {
                if (oferyList.get(i).getNazwa().equals("")) {
                    continue;
                }
                session.save(oferyList.get(i));

            } else {
                session.update(oferyList.get(i));

            }
        }
        tx.commit();
        session.close();
    }
}
